在最新的3.0
版本中,我们实现了一个全新的 PHP
内置协程调度器,基于ZendVM
的 EG(vm_interrupt)
机制实现,移除了 setjmp/longjmp
的依赖。使得 Swoole
协程可以应用于任何位置,包括PHP
对象析构函数、魔术方法、反射函数调用 等场景,新的版本号将更改为Swoole 3.0
,原计划基于libco
的C
栈协程,推迟到4.0
。
新版协程内核依赖PHP-7.1
,因此Swoole
对PHP
的版本依赖提高至7.1
,对gcc
的版本依赖提高至4.8
。
3.0 分支已废弃,请勿使用
3.0
版本提供了一个更底层Co\Socket
模块,封装了操作系统socket
相关API
。某些情况下Server
和Client
无法满足需求,这时可以使用Co\Socket
自行实现Server
和Client
功能。
$socket = new Co\Socket(AF_INET, SOCK_STREAM, 0);
$socket->bind('127.0.0.1', 9601);
$socket->listen(128);
go(function () use ($socket) {
while(true) {
echo "Accept: \n";
$client = $socket->accept();
echo "New Coroutine: \n";
go(function () use ($client) {
while(true) {
echo "Client Recv: \n";
$data = $client->recv();
if (empty($data)) {
$client->close();
break;
}
var_dump($client->getsockname());
var_dump($client->getpeername());
echo "Client Send: \n";
$client->send("Server: $data");
}
});
}
});
$socket = new Co\Socket(AF_INET, SOCK_STREAM, 0);
go(function () use ($socket) {
$retval = $socket->connect('localhost', 9601);
while ($retval)
{
$n = $socket->send("hello");
var_dump($n);
$data = $socket->recv();
var_dump($data);
if (empty($data)) {
$socket->close();
break;
}
co::sleep(1.0);
}
var_dump($retval, $socket->errCode);
});
从3.0
版本开始,我们使用了C++
作为主要的开发语言。新增的模块基于C++ 11
进行开发。以降低开发成本,提升效率。
编译3.0
版本,需要gcc-4.8
或更高版本。另外,3.0
还引入了PHP-X
,某些模块将会基于PHP-X
进行开发。
- 增加
Http\Response->detach
和Http\Response::create
方法 - 增加
Http\Response->redirect
方法 - 增加
Runtime::enableStrictMode
方法,可禁用PHP
提供的同步阻塞函数和类 - 修复
Co\Redis
连接失败时发生内存泄漏的问题 - 修复
SOCK_DGRAM
类型客户端连接被拒绝时抛出的无效错误日志